#include "listapaises.h"

ListaPaises::ListaPaises()
{
    this->paises.append(new Pais("Brasil"));
    this->paises.append(new Pais("Africa do Sul"));
    this->paises.append(new Pais("Alaska"));
    this->paises.append(new Pais("Alemanha"));
    this->paises.append(new Pais("Aral"));
    this->paises.append(new Pais("Argelia"));
    this->paises.append(new Pais("Argentina"));
    this->paises.append(new Pais("Australia"));
    this->paises.append(new Pais("Borneo"));
    this->paises.append(new Pais("California"));
    this->paises.append(new Pais("Chile"));
    this->paises.append(new Pais("China"));
    this->paises.append(new Pais("Colombia"));
    this->paises.append(new Pais("Congo"));
    this->paises.append(new Pais("Dudinka"));
    this->paises.append(new Pais("Egito"));
    this->paises.append(new Pais("Franca"));
    this->paises.append(new Pais("Groenlandia"));
    this->paises.append(new Pais("India"));
    this->paises.append(new Pais("Inglaterra"));
    this->paises.append(new Pais("Islandia"));
    this->paises.append(new Pais("Japao"));
    this->paises.append(new Pais("Labrador"));
    this->paises.append(new Pais("Mackenzie"));
    this->paises.append(new Pais("Madagascar"));
    this->paises.append(new Pais("Mexico"));
    this->paises.append(new Pais("Mongolia"));
    this->paises.append(new Pais("Moscou"));
    this->paises.append(new Pais("Nova Guine"));
    this->paises.append(new Pais("Nova York"));
    this->paises.append(new Pais("Omsk"));
    this->paises.append(new Pais("Oriente Medio"));
    this->paises.append(new Pais("Ottawa"));
    this->paises.append(new Pais("Polonia"));
    this->paises.append(new Pais("Siberia"));
    this->paises.append(new Pais("Sudao"));
    this->paises.append(new Pais("Suecia"));
    this->paises.append(new Pais("Sumatra"));
    this->paises.append(new Pais("Tchita"));
    this->paises.append(new Pais("Vancouver"));
    this->paises.append(new Pais("Vietna"));
    this->paises.append(new Pais("Vladivostok"));

    this->paises_disponiveis = this->paises;
}

Pais* ListaPaises::sortearPais()
{
    int index = qrand() % this->paises_disponiveis.size();
    Pais* pais = this->paises_disponiveis.at(index);
    this->paises_disponiveis.removeAt(index);
    return pais;
}

void ListaPaises::mudancaTropaPais(QString texto)
{
    QString tag_pais = "<pais>";
    QString tag_tropas = "<numero_tropas>";
    QString nome_pais = texto.split(tag_pais).at(1);
    nome_pais = nome_pais.split(tag_tropas).at(0);
    QString tropas = texto.split(tag_tropas).at(1);
    int num_tropas = tropas.toInt();
    int index;
    for (index = 0; index < this->paises.size(); index ++)
        if (this->paises.at(index)->nome == nome_pais)
            break;
    this->paises.at(index)->numero_tropas = num_tropas;
    emit this->tropasAlteradas("<tipo>mtp" + texto);
}

int ListaPaises::sorteiaNumero()
{
    int num = qrand() % 6;
    return num + 1;
}

void ListaPaises::ordenaVetor(int *vet)
{
    int num1 = vet[0];
    int num2 = vet[1];
    int num3 = vet[2];

    if (num1 >= num2) {

        if (num2 >= num3)
            return;

        else {

            if (num1 >= num3) {

                vet[1] = num3;
                vet[2] = num2;
                return;
            }

            else {

                vet[0] = num3;
                vet[1] = num1;
                vet[2] = num2;
            }
        }
    }

    else {

        if (num2 >= num3) {

            if (num3 >= num1) {
                vet[0] = num2;
                vet[1] = num3;
                vet[2] = num1;
                return;
            }

            else {

                vet[0] = num2;
                vet[1] = num1;
                vet[2] = num3;
                return;
            }

        }

        else {

            vet[0] = num3;
            vet[1] = num2;
            vet[2] = num1;
        }
    }
}

void ListaPaises::processarAtaque(QString texto)
{
    QString tag_atacante = "<pais_atacante>";
    QString tag_tropas_atacante = "<tropas_ataque>";
    QString tag_defensor = "<pais_defensor>";
    QString tag_tropas_defesa = "<tropas_defesa>";

    QString pais_atacante = texto.split(tag_atacante).at(1);
    pais_atacante = pais_atacante.split(tag_tropas_atacante).at(0);

    QString tropas_ataque = texto.split(tag_tropas_atacante).at(1);
    tropas_ataque = tropas_ataque.split(tag_defensor).at(0);

    QString pais_defensor = texto.split(tag_defensor).at(1);
    pais_defensor = pais_defensor.split(tag_tropas_defesa).at(0);

    QString tropas_defesa = texto.split(tag_tropas_defesa).at(1);

    int indice_atacante;
    int indice_defesa;

    for (indice_atacante = 0; indice_atacante < this->paises.size(); indice_atacante++)
        if (this->paises.at(indice_atacante)->nome == pais_atacante)
            break;

    for (indice_defesa = 0; indice_defesa < this->paises.size(); indice_defesa++)
        if (this->paises.at(indice_defesa)->nome == pais_defensor)
            break;

    int num_atacantes = tropas_ataque.toInt();
    int num_defensores = tropas_defesa.toInt();

    int perdas_ataque = 0;
    int perdas_defesa = 0;

    int valores_ataque[3];
    int valores_defesa[3];

    for (int i = 0; i < 3; i++) {

        if (i < num_atacantes)
            valores_ataque[i] = this->sorteiaNumero();
        else
            valores_ataque[i] = 0;
        if (i < num_defensores)
            valores_defesa[i] = this->sorteiaNumero();
        else
            valores_defesa[i] = 0;
    }

    this->ordenaVetor(valores_ataque);
    this->ordenaVetor(valores_defesa);

    int num_comparacoes;

    if (num_atacantes <= num_defensores)
        num_comparacoes = num_atacantes;
    else
        num_comparacoes = num_defensores;

    for (int i = 0; i < num_comparacoes; i++) {

        if (valores_defesa[i] >= valores_ataque[i])
            perdas_ataque++;
        else
            perdas_defesa++;
    }

    emit this->sorteioDados("<tipo>vda<atacante>" + this->paises.at(indice_atacante)->participante->nome_jogador +
                            "<valor>" + QString::number(valores_ataque[0]) +
                            "<valor>" + QString::number(valores_ataque[1]) +
                            "<valor>" + QString::number(valores_ataque[2]) +
                            "<defensor>" + this->paises.at(indice_defesa)->participante->nome_jogador +
                            "<valor>" + QString::number(valores_defesa[0]) +
                            "<valor>" + QString::number(valores_defesa[1]) +
                            "<valor>" + QString::number(valores_defesa[2]));

    if (this->paises.at(indice_defesa)->numero_tropas - perdas_defesa == 0) {

        qDebug () << "aki";
        this->paises.at(indice_atacante)->numero_tropas -= num_atacantes;
        this->paises.at(indice_defesa)->numero_tropas = num_atacantes - perdas_ataque;
        this->paises.at(indice_defesa)->participante->num_paises --;
        this->paises.at(indice_defesa)->participante = this->paises.at(indice_atacante)->participante;
        this->paises.at(indice_defesa)->participante->num_paises++;

        this->mudancaTropaPais("<tipo>mtp<pais>" + pais_atacante + "<numero_tropas>" +
                               QString::number(this->paises.at(indice_atacante)->numero_tropas));

        emit this->paisDerrotado("<tipo>bat<pais>" + this->paises.at(indice_defesa)->nome +
                                 "<jogador>" + this->paises.at(indice_defesa)->participante->nome_jogador +
                                 "<tropas>" + QString::number(this->paises.at(indice_defesa)->numero_tropas) +
                                 "<cor>" + this->paises.at(indice_defesa)->participante->cor);

    }

    else {

        qDebug () << "lah";
        this->paises.at(indice_atacante)->numero_tropas -= perdas_ataque;
        this->paises.at(indice_defesa)->numero_tropas -= perdas_defesa;
        this->mudancaTropaPais("<tipo>mtp<pais>" + pais_atacante + "<numero_tropas>" +
                               QString::number(this->paises.at(indice_atacante)->numero_tropas));
        this->mudancaTropaPais("<tipo>mtp<pais>" + pais_defensor + "<numero_tropas>" +
                               QString::number(this->paises.at(indice_defesa)->numero_tropas));
    }

}

QStringList ListaPaises::paisesDoJogador(QString nome_jogador)
{
    QStringList paises;
    for (int i = 0; i < this->paises.size(); i++)
        if (this->paises.at(i)->participante->nome_jogador == nome_jogador)
            paises.append(this->paises.at(i)->nome);
    return paises;
}
